package main

import (
	// "crypto/rand"
	"fmt"
)

func main() {
	// 数组
	// array:=[5]string{"a","b","c","d","e"}
	// for i:=0;i<len(array);i++{
	// 	fmt.Println(array[i])
	// }
	// for i,v:=range array{
	// 	fmt.Printf("数组索引:%d,对应值:%s\n", i, v)
	// }
	// for _,v:=range array{
	// 	fmt.Printf("对应值:%s\n", v)
	// }
	// array:=[...]string{"a","b","c","d","e"}
	// fmt.Println(array[1])
	// array1:=[5]string{1:"b",3:"d"}
	// fmt.Println(array1)

	// slice 切片
	// array:=[5]string{"a","b","c","d","e"}
	// slice:=array[1:5] //  右边的数字不会被包含
	// slice[1]="f" // 修改  使用的底层数组还是原来的数组
	// fmt.Println(slice)
	// fmt.Println(array)
	// slice1:=make([]string,4) // 声明切片 make函数 长度4
	/*
		Go 语言在内存上划分了一块容量为 8 的内容空间（容量为 8），但是只有 4 个内存空间才有元素（长度为 4），
		其他的内存空间处于空闲状态，当通过 append 函数往切片中追加元素的时候，会追加到空闲的内存上，
		当切片的长度要超过容量的时候，会进行扩容
	*/
	// slice2:=make([]string,4,8) // 长度4 容量8 切片的容量不能比切片的长度小 容量就是切片的空间
	// slice3:=[]string{"a","b","c","d","e"}// 字面量声明
	// // slice4:=append(slice3,"f") // 追加一个元素
	// // slice4:=append(slice3,"f","g") // 多个元素
	// slice9:=[]string{"n"}
	// slice4:=append(slice3,slice9...) // 一个切片
	// fmt.Println(slice4)

	// nameAgeMap:=make(map[string]int) // make函数声明map
	// nameAgeMap["lt"]=20

	// nameAgeMap:=map[string]int{"lt":20}
	// nameAgeMap["lt2"]=20 // 添加键值
	// age:=nameAgeMap["lt2"]// //获取指定 Key 对应的 Value Key 不存在，返回的 Value 是该类型的零值
	// fmt.Println(age)
	// fmt.Println(nameAgeMap)

	// nameAgeMap:=make(map[string]int)
	// nameAgeMap["飞雪无情"] = 20
	// // delete(nameAgeMap,"飞雪无情")// 删除key （map,key）
	// age,ok:=nameAgeMap["飞雪无情"] // ok是否存在
	// if ok {
	// 	fmt.Println(age)
	// }
	// 遍历map
	// //测试 for range
	// nameAgeMap:=make(map[string]int)
	// nameAgeMap["飞雪无情"] = 20
	// nameAgeMap["飞雪无情1"] = 21
	// nameAgeMap["飞雪无情2"] = 22
	// for k,v:=range nameAgeMap{ // map 的遍历是无序的
	// 	fmt.Println("Key is",k,",Value is",v)
	// }
	// fmt.Println(len(nameAgeMap)) // 没有容量 只有长度

	// string byte
	// s:="Hello飞雪无情"
	// bs:=[]byte(s) // 字符串转字节切片
	// fmt.Println(bs)
	// fmt.Println(s[0],s[1])
	// fmt.Println(len(s)) // 字节长度 for range是按照 unicode 字符进行循环
	// // fmt.Println(utf8.RuneCountInString(s))// 汉字长度
	// for i,r:=range s{
	// 	fmt.Println(i,r) // r是码点
	// }

	// 二维数组
	// aa := [3][3]int{}
	// aa[0][0] = 1
	// aa[0][1] = 2
	// aa[0][2] = 3
	// aa[1][0] = 4
	// aa[1][1] = 5
	// aa[1][2] = 6
	// aa[2][0] = 7
	// aa[2][1] = 8
	// aa[2][2] = 9
	// fmt.Println(aa)

	// rand.Seed(time.Now().Unix())
	// var b [10]int
	// for i := 0; i < len(b); i++ {
	// 	b[i] = rand.Intn(1000)
	// }
	// sum := sumArr(b)
	// fmt.Printf("sum=%d\n", sum)

	b := [5]int{1, 3, 5, 8, 7}
	// 1+7 3+5
	myTest(b, 8)

	slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	d1 := slice[6:8]
	fmt.Println(d1, len(d1), cap(d1))
	d2 := slice[:6:8]
	fmt.Println(d2, len(d2), cap(d2))
}

// 求元素之和
func sumArr(a [10]int) int {
	var sum int = 0
	for i := 0; i < len(a); i++ {
		sum += a[i]
	}
	return sum
}

// 求元素和，是给定的值
func myTest(a [5]int, target int) {
	// 遍历数组
	for i := 0; i < len(a); i++ {
		other := target - a[i]
		// 继续遍历
		for j := i + 1; j < len(a); j++ {
			if a[j] == other {
				fmt.Printf("(%d,%d)\n", i, j)
			}
		}
	}
}
